package xin.ryven.car.android.utils

import android.content.Context
import xin.ryven.car.android.data.Music
import java.io.File
import java.net.URLConnection

object FileUtils {
    fun getMusicFile(context: Context, music: Music): File {
        val musicDir = File(context.getExternalFilesDir(null), "music")
        if (!musicDir.exists()) {
            musicDir.mkdirs()
        }
        
        // 处理空URL的情况
        val fileName = if (music.downloadUrl.isNullOrEmpty()) {
            "music_${music.id}.flac"  // 使用默认文件名
        } else {
            try {
                music.downloadUrl.substringAfterLast("/")
            } catch (e: Exception) {
                "music_${music.id}.flac"  // 如果解析失败，使用默认文件名
            }
        }
        
        return File(musicDir, fileName)
    }

    fun getLrcFile(context: Context, music: Music): File {
        val musicDir = File(context.getExternalFilesDir(null), "music")
        if (!musicDir.exists()) {
            musicDir.mkdirs()
        }
        
        // 处理空URL的情况
        val fileName = if (music.lrcUrl.isNullOrEmpty()) {
            "lyric_${music.id}.lrc"  // 使用默认文件名
        } else {
            try {
                music.lrcUrl.substringAfterLast("/")
            } catch (e: Exception) {
                "lyric_${music.id}.lrc"  // 如果解析失败，使用默认文件名
            }
        }
        
        return File(musicDir, fileName)
    }

    fun getCoverFile(context: Context, coverUrl: String?): File {
        val musicDir = File(context.getExternalFilesDir(null), "music")
        if (!musicDir.exists()) {
            musicDir.mkdirs()
        }
        
        // 处理空URL的情况
        val fileName = if (coverUrl.isNullOrEmpty()) {
            "cover_default.jpg"  // 使用默认文件名
        } else {
            try {
                coverUrl.substringAfterLast("/")
            } catch (e: Exception) {
                "cover_${System.currentTimeMillis()}.jpg"  // 使用时间戳作为文件名
            }
        }
        
        return File(musicDir, fileName)
    }

    fun getCoverFiles(context: Context, music: Music): List<File> {
        return music.covers?.let { covers ->
            if (covers.isBlank()) {
                emptyList()
            } else {
                try {
                    covers.split(",")
                        .map { coverUrl -> getCoverFile(context, coverUrl.trim()) }
                } catch (e: Exception) {
                    emptyList()
                }
            }
        } ?: emptyList()
    }

    fun isMusicFileExists(context: Context, music: Music): Boolean {
        return getMusicFile(context, music).exists()
    }

    fun isValidFile(context: Context, music: Music): Boolean {
        val file = getMusicFile(context, music)
        return file.exists() && file.length() > 0 && isAudioFile(file)
    }

    fun isAudioFile(file: File): Boolean {
        return try {
            val mimeType = URLConnection.guessContentTypeFromName(file.name)
            mimeType?.startsWith("audio/") == true
        } catch (e: Exception) {
            false
        }
    }
} 